<!DOCTYPE html>
<!-- saved from url=(0127)https://docs.google.com/document/d/e/2PACX-1vQauZtd0BbuU1KiSd8hrL5uIO9qmT5BjtTO7IoR6WuFT_vsMNNzzK0_T81aY0T_sk4-DxND4UaugQhb/pub -->
<html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><title>WebPerfWG design call - May 2nd 2019</title><link rel="shortcut icon" href="https://ssl.gstatic.com/docs/documents/images/kix-favicon7.ico"><meta name="referrer" content="strict-origin-when-cross-origin"><style type="text/css" nonce="">
      @import url("https://fonts.googleapis.com/css?family=Google+Sans");
      @import url("https://fonts.googleapis.com/css?family=Roboto");

      body {
        font-family: Roboto, arial, sans, sans-serif;
        margin: 0;
      }

      iframe {
        border: 0;
        frameborder: 0;
        height: 100%;
        width: 100%;
      }

      #header {
        align-items: center;
        background: white;
        border-bottom: 1px #ccc solid;
        display: flex;
        height: 60px;
        justify-content: space-between;
        position: fixed;
        top: 0;
        width: 100%;
        z-index: 100;
      }

      #header #title {
        font-family: 'Google Sans';
        font-size: large;
        margin: auto 0 auto 20px;
        overflow: hidden;
        text-overflow: ellipsis;
        white-space: nowrap;
        width: 70%;
      }

      #header #interval {
        margin: auto 25px auto 0;
        font-family: Roboto;
        font-size: small;;
      }

      #footer {
        background: #f0f0f0;
        border-bottom: 1px #ccc solid;
        bottom: 0;
        font-family: Roboto;
        font-size: small;
        padding: 10px 10px;
        position: fixed;
        text-align: center;
        width: 100%;
      }

      #contents {
        padding: 100px 20% 50px 20%;
      }

      @media only screen and (max-device-width: 800px) {
        #header {
          border-bottom-width: 5px;
          height: auto;
          display: block;
        }

        #header #title {
          font-size: 3em;
          margin: auto 0 auto 20px;
          width: 90%;
        }

        #header #interval {
          font-size: 1.5em;
          margin: 10px 0 auto 25px;
        }

        #contents {
          padding: 150px 5% 80px;
        }

        #footer {
          font-size: 2em;
        }
      }

      .dash {
        padding: 0 6px;
      }
    </style></head><body><div id="header"><div id="title">WebPerfWG design call - May 2nd 2019</div><div id="interval"><span></span></div></div><div id="contents"><style type="text/css">.lst-kix_vd881xrd9hrg-0>li:before{content:"\0025cf  "}ul.lst-kix_vd881xrd9hrg-6{list-style-type:none}ul.lst-kix_vd881xrd9hrg-7{list-style-type:none}ul.lst-kix_vd881xrd9hrg-8{list-style-type:none}.lst-kix_vd881xrd9hrg-5>li:before{content:"\0025a0  "}li.li-bullet-0:before{margin-left:-18pt;white-space:nowrap;display:inline-block;min-width:18pt}.lst-kix_vd881xrd9hrg-6>li:before{content:"\0025cf  "}.lst-kix_vd881xrd9hrg-7>li:before{content:"\0025cb  "}ul.lst-kix_vd881xrd9hrg-0{list-style-type:none}ul.lst-kix_vd881xrd9hrg-1{list-style-type:none}ul.lst-kix_vd881xrd9hrg-2{list-style-type:none}ul.lst-kix_vd881xrd9hrg-3{list-style-type:none}.lst-kix_vd881xrd9hrg-4>li:before{content:"\0025cb  "}.lst-kix_vd881xrd9hrg-8>li:before{content:"\0025a0  "}ul.lst-kix_vd881xrd9hrg-4{list-style-type:none}ul.lst-kix_vd881xrd9hrg-5{list-style-type:none}.lst-kix_vd881xrd9hrg-2>li:before{content:"\0025a0  "}.lst-kix_vd881xrd9hrg-3>li:before{content:"\0025cf  "}.lst-kix_vd881xrd9hrg-1>li:before{content:"\0025cb  "}ol{margin:0;padding:0}table td,table th{padding:0}.c1{margin-left:36pt;padding-top:0pt;padding-left:0pt;padding-bottom:0pt;line-height:1.15;orphans:2;widows:2;text-align:left}.c5{margin-left:72pt;padding-top:0pt;padding-left:0pt;padding-bottom:0pt;line-height:1.15;orphans:2;widows:2;text-align:left}.c3{color:#000000;font-weight:400;text-decoration:none;vertical-align:baseline;font-size:11pt;font-family:"Arial";font-style:normal}.c0{color:#000000;font-weight:400;text-decoration:none;vertical-align:baseline;font-size:16pt;font-family:"Arial";font-style:normal}.c4{padding-top:18pt;padding-bottom:6pt;line-height:1.15;page-break-after:avoid;orphans:2;widows:2;text-align:left}.c10{color:#000000;font-weight:400;text-decoration:none;vertical-align:baseline;font-size:11pt;font-family:"Arial";font-style:italic}.c7{padding-top:0pt;padding-bottom:0pt;line-height:1.15;orphans:2;widows:2;text-align:left;height:11pt}.c8{padding-top:0pt;padding-bottom:0pt;line-height:1.15;orphans:2;widows:2;text-align:left}.c12{text-decoration-skip-ink:none;-webkit-text-decoration-skip:none;color:#1155cc;text-decoration:underline}.c6{text-decoration-skip-ink:none;-webkit-text-decoration-skip:none;font-weight:700;text-decoration:underline}.c15{background-color:#ffffff;max-width:468pt;padding:72pt 72pt 72pt 72pt}.c2{padding:0;margin:0}.c14{color:inherit;text-decoration:inherit}.c11{margin-left:144pt;padding-left:0pt}.c9{margin-left:108pt;padding-left:0pt}.c13{font-weight:700}.title{padding-top:0pt;color:#000000;font-size:26pt;padding-bottom:3pt;font-family:"Arial";line-height:1.15;page-break-after:avoid;orphans:2;widows:2;text-align:left}.subtitle{padding-top:0pt;color:#666666;font-size:15pt;padding-bottom:16pt;font-family:"Arial";line-height:1.15;page-break-after:avoid;orphans:2;widows:2;text-align:left}li{color:#000000;font-size:11pt;font-family:"Arial"}p{margin:0;color:#000000;font-size:11pt;font-family:"Arial"}h1{padding-top:20pt;color:#000000;font-size:20pt;padding-bottom:6pt;font-family:"Arial";line-height:1.15;page-break-after:avoid;orphans:2;widows:2;text-align:left}h2{padding-top:18pt;color:#000000;font-size:16pt;padding-bottom:6pt;font-family:"Arial";line-height:1.15;page-break-after:avoid;orphans:2;widows:2;text-align:left}h3{padding-top:16pt;color:#434343;font-size:14pt;padding-bottom:4pt;font-family:"Arial";line-height:1.15;page-break-after:avoid;orphans:2;widows:2;text-align:left}h4{padding-top:14pt;color:#666666;font-size:12pt;padding-bottom:4pt;font-family:"Arial";line-height:1.15;page-break-after:avoid;orphans:2;widows:2;text-align:left}h5{padding-top:12pt;color:#666666;font-size:11pt;padding-bottom:4pt;font-family:"Arial";line-height:1.15;page-break-after:avoid;orphans:2;widows:2;text-align:left}h6{padding-top:12pt;color:#666666;font-size:11pt;padding-bottom:4pt;font-family:"Arial";line-height:1.15;page-break-after:avoid;font-style:italic;orphans:2;widows:2;text-align:left}</style><div class="c15"><h2 class="c4" id="h.lsn3a99oqqm"><span class="c0">Participants</span></h2><p class="c8"><span class="c3">Will Hawkins, Emily Hanley, Tim Dresser, Nicol&aacute;s Pe&ntilde;a, Gilles Dubusc, Philippe Le Hegaret, Shubhie Panicker, Ryosuke Niwa, Benjamin De Kosnik, Steven Bougon, Ilya Grigorik, Todd Reifsteck, Andrew Comminos, Nic Jansma, Scott Haseley, Markus Stange, Shweta Joshi</span></p><p class="c7"><span class="c3"></span></p><p class="c8"><span class="c6">Chair</span><span class="c3"><b></b>: Yoav Weiss</span></p><p class="c7"><span class="c3"></span></p><p class="c8"><span class="c6">Next call</span><span class="c3"><b></b>: 16th May 11am PST</span></p><p class="c7"><span class="c3"></span></p><p class="c8"><span class="c13">AI</span><span class="c3"><b></b>: Yoav to send notification to the list on the F2F</span></p><p class="c7"><span class="c3"></span></p><h2 class="c4" id="h.nryqm2rkx1l9"><span class="c12"><a class="c14" href="https://www.google.com/url?q=https://docs.google.com/presentation/d/13WXMne_wccp-GRoAKIzGyyILFV95P-29mZ4OiYVeeso/edit?usp%3Dsharing&amp;sa=D&amp;source=editors&amp;ust=1613235730334000&amp;usg=AOvVaw3XmISgTWtQd4xerdEjhi33">Main Thread Scheduling</a></span><span class="c0">&nbsp;(Scott Haseley)</span></h2><p class="c8"><span class="c3">Native scheduling API - wanted to update the group.</span></p><ul class="c2 lst-kix_vd881xrd9hrg-0 start"><li class="c1 li-bullet-0"><span><b>Scott</b>: </span><span class="c10">presenting</span></li></ul><ul class="c2 lst-kix_vd881xrd9hrg-1 start"><li class="c5 li-bullet-0"><span class="c3">Motivation</span></li></ul><ul class="c2 lst-kix_vd881xrd9hrg-2 start"><li class="c8 c9 li-bullet-0"><span class="c3">Userspace schedulers are limited to framework, app or userspace</span></li></ul><ul class="c2 lst-kix_vd881xrd9hrg-1"><li class="c5 li-bullet-0"><span class="c3">Native scheduler will be able to schedule multiple unrelated entities - shared notion of priority</span></li><li class="c5 li-bullet-0"><span class="c3"><b>Current web scheduling model</b>: input, then rendering, then everything else, then idle</span></li></ul><ul class="c2 lst-kix_vd881xrd9hrg-2 start"><li class="c8 c9 li-bullet-0"><span class="c3">Everything else is not well-scheduled, one big FIFO</span></li></ul><ul class="c2 lst-kix_vd881xrd9hrg-0"><li class="c1 li-bullet-0"><span class="c3"><b>Rniwa</b>: this model works for blink, but webkit doesn’t prioritize input</span></li><li class="c1 li-bullet-0"><span class="c3"><b>Scott</b>: do you actually prioritize different things?</span></li><li class="c1 li-bullet-0"><span class="c3"><b>Shubhie</b>: probably less prioritization in webkit. Let’s talk more after the presentation.</span></li><li class="c1 li-bullet-0"><span class="c3"><b>Scott</b>: have different task queues, but for a single document, it’s a single task queue</span></li></ul><ul class="c2 lst-kix_vd881xrd9hrg-1 start"><li class="c5 li-bullet-0"><span class="c3">React scheduler prioritizes specific tasks, but only meaningful in the context of react. The browser is not aware of them</span></li><li class="c5 li-bullet-0"><span class="c3">The MVP plans to resolve that problem.</span></li><li class="c5 li-bullet-0"><span class="c3"><b>Other problems</b>: no unified API, when to schedule frames, clean reads (maybe requestPostAnimationFrame solves that)</span></li><li class="c5 li-bullet-0"><span class="c3">Requirements - unified priorities, above and below the default, separation of API priorities from internal priorities</span></li><li class="c5 li-bullet-0"><span class="c3"><b>Propose new priorities</b>: 8 new levels: immediate, input events, rendering, input, high, default, low, Idle</span></li><li class="c5 li-bullet-0"><span class="c3">React e.g. wants to yield to input, but maybe not immediately</span></li><li class="c5 li-bullet-0"><span class="c3">What do we want to prioritize? Userscript tasks, events, script parsing, etc. Most beyond scope.</span></li><li class="c5 li-bullet-0"><span class="c3">Static or dynamic priority system? Maps uses static, React dynamic</span></li><li class="c5 li-bullet-0"><span class="c3">Browser control? Priorities system? Could go with shared priority queues or isolated ones</span></li><li class="c5 li-bullet-0"><span class="c3"><b>Proposal</b>: start simple. Single set of priorities. Different apps have different requirements and dynamic seems more complex and may not be needed. Also plans to start with unified set of task queues.</span></li><li class="c5 li-bullet-0"><span class="c3">Plan to publish explainer, implement and experiment with, and have partners play with</span></li><li class="c5 li-bullet-0"><span class="c3">Invite all to comment.</span></li></ul><ul class="c2 lst-kix_vd881xrd9hrg-0"><li class="c1 li-bullet-0"><span class="c3"><b>Shubhie</b>: Just creating a postTask based API is probably insufficient. So plan to push more API and integrate script and fetch tags</span></li></ul><ul class="c2 lst-kix_vd881xrd9hrg-1 start"><li class="c5 li-bullet-0"><span class="c3">Most important is hearing what kind of validation people want to see.</span></li></ul><ul class="c2 lst-kix_vd881xrd9hrg-0"><li class="c1 li-bullet-0"><span class="c3"><b>Ryosuke</b>: From our side, unclear what user facing issues are we trying to solve</span></li><li class="c1 li-bullet-0"><span class="c3"><b>Shubhie</b>: it’s mostly about juggling priorities and deadlines. We tell developers they got deadlines to run their code to keep their apps responsive, but it’s hard for them to achieve that.</span></li><li class="c1 li-bullet-0"><span class="c3"><b>Ryosuke</b>: Is the goal to increase user responsiveness?</span></li><li class="c1 li-bullet-0"><span class="c3"><b>Shubhie</b>: Increase responsiveness for input (100ms), frmae rates (10ms)</span></li><li class="c1 li-bullet-0"><span class="c3"><b>Scott</b>: FIFO gives you some order, and user facing experience metrics depend on that order. And current order is not optimal</span></li><li class="c1 li-bullet-0"><span class="c3"><b>Ryosuke</b>: what are we trying to optimize?</span></li><li class="c1 li-bullet-0"><span class="c3"><b>Shubhie</b>: user input</span></li><li class="c1 li-bullet-0"><span class="c3"><b>Scott</b>: Also loading metrics, scripts can be responsible for rendering</span></li><li class="c1 li-bullet-0"><span class="c3"><b>Shubhie</b>: Also FID</span></li><li class="c1 li-bullet-0"><span class="c3"><b>Ilya</b>: I assume the explainer spells out the motivation</span></li><li class="c1 li-bullet-0"><span class="c3"><b>Shubhie</b>: yes, the explainer has the motivations</span></li><li class="c1 li-bullet-0"><span class="c3"><b>Ilya</b>: Maybe take an AI to read through that and come back with feedback</span></li><li class="c1 li-bullet-0"><span class="c3"><b>Will</b>: When we talk about optimizing for the user, is that the end user or the developer?</span></li><li class="c1 li-bullet-0"><span class="c3"><b>Shubhie</b>: helping the web developer to achieve end-user expectations</span></li><li class="c1 li-bullet-0"><span class="c3"><b>Ryosuke</b>: Sounds like the criteria will be based on the case studies, build something with the new API and measure that</span></li><li class="c1 li-bullet-0"><span class="c3"><b>Andrew</b>: Speaking for React, we wanted isUserPending to make sure task throughput is high. The high level API needs to keep that throughput.</span></li><li class="c1 li-bullet-0"><span class="c3"><b>Shubhie</b>: We’ll get experimentation results from partners.</span></li><li class="c1 li-bullet-0"><span class="c3"><b>Ryosuke</b>: if you have a priority you want to have a priority inversion</span></li><li class="c1 li-bullet-0"><span class="c3"><b>Todd</b>: When we move to dynamic, what will happen?</span></li></ul><ul class="c2 lst-kix_vd881xrd9hrg-1 start"><li class="c5 li-bullet-0"><span class="c3">There can be priority inversions in case of timeouts. High priority work can get stuck behind low priority work. We also have priority inversion now, where scheduling high priority work is stuck behind everything. So it won’t make things worse.</span></li></ul><ul class="c2 lst-kix_vd881xrd9hrg-0"><li class="c1 li-bullet-0"><span class="c3"><b>Ryosuke</b>: Not worse, but seems like *the* thing we want to solve here</span></li><li class="c1 li-bullet-0"><span class="c3"><b>Scott</b>: the MVP includes a way to change priorities. So you’d be able to build priority systems in userspace based on that</span></li><li class="c1 li-bullet-0"><span class="c3"><b>Shubhie</b>: The maps use-case, when the user is panning the map, the highest priority is fetching the tiles, but user behavior change can mean we need to do something else right now. Developers need a way to indicate priority change</span></li><li class="c1 li-bullet-0"><span class="c3"><b>Scott</b>: With virtual task queues as a subset of task queues, you’d be able to move tasks between the queues. You could create a periodic high priority task that changes priorities. Virtual task queues will enable userspace scripts to change priorities on their own.</span></li><li class="c1 li-bullet-0"><span class="c3"><b>Shubhie</b>: can add scenarios to the explainer.</span></li><li class="c1 li-bullet-0"><span class="c3"><b>Ryosuke</b>: Have you talked to Android scheduler folks? Relying on users to adjust priorities is tricky. In iOS, user interaction is highest priority and adjustments are done automatically. Might be better to define dependencies.</span></li><li class="c1 li-bullet-0"><span class="c3"><b>Ben</b>: Appreciate the context given by Google Maps panning example. Willing to file issues on WICG. Context is super helpful</span></li><li class="c1 li-bullet-0"><span class="c3"><b>Ryosuke</b>: Also would be great to update GH with what was presented.</span></li></ul><h2 class="c4" id="h.7r8qgpnsxjpi"><span class="c12"><a class="c14" href="https://www.google.com/url?q=https://docs.google.com/presentation/d/1Ex_bD6oMLirboYYWJnUBySbw2i8fzb143P1lNenLNAI/edit?usp%3Dsharing&amp;sa=D&amp;source=editors&amp;ust=1613235730339000&amp;usg=AOvVaw2rE1UJKG37Ph299YiEHW1D">JS Self-Profiling feedback and updates</a></span><span>&nbsp;- </span><span class="c12"><a class="c14" href="mailto:acomminos@fb.com">acomminos@fb.com</a></span></h2><p class="c7"><span class="c3"></span></p><ul class="c2 lst-kix_vd881xrd9hrg-0"><li class="c1 li-bullet-0"><span><b>Andrew</b>: </span><span class="c10">presenting</span></li></ul><ul class="c2 lst-kix_vd881xrd9hrg-1 start"><li class="c5 li-bullet-0"><span class="c3">Focused on cross-origin concerns and evaluate feasibility through Blink implementation</span></li><li class="c5 li-bullet-0"><span class="c3">So far so good, and crossorigin script situation uses current infra</span></li><li class="c5 li-bullet-0"><span class="c3">Main issues</span></li></ul><ul class="c2 lst-kix_vd881xrd9hrg-2 start"><li class="c8 c9 li-bullet-0"><span class="c3">Symbolization map before profiling is fairly expensive - CPU and memory</span></li><li class="c8 c9 li-bullet-0"><span class="c3">Trace sizes are about what we expected</span></li><li class="c8 c9 li-bullet-0"><span class="c3">Testing is a bit challenging - no SLA to what sampling rate </span></li></ul><ul class="c2 lst-kix_vd881xrd9hrg-1"><li class="c5 li-bullet-0"><span class="c3">Symbolication</span></li></ul><ul class="c2 lst-kix_vd881xrd9hrg-2 start"><li class="c8 c9 li-bullet-0"><span class="c3">Either always build the codemap but expensive when not used</span></li><li class="c8 c9 li-bullet-0"><span class="c3">Lazily building it is not great, as it’s done on the VM thread. Can also leak data</span></li></ul><ul class="c2 lst-kix_vd881xrd9hrg-3 start"><li class="c8 c11 li-bullet-0"><span class="c3">200-300ms on high end desktop machine</span></li></ul><ul class="c2 lst-kix_vd881xrd9hrg-2"><li class="c8 c9 li-bullet-0"><span class="c3">Greedy is best, if we know we need it</span></li><li class="c8 c9 li-bullet-0"><span class="c3">Maybe declaring it through feature policy. Since it’s restricted to frames, it kinda works</span></li><li class="c8 c9 li-bullet-0"><span class="c3">Increases the overhead of deploying that.</span></li></ul><ul class="c2 lst-kix_vd881xrd9hrg-0"><li class="c1 li-bullet-0"><span class="c3"><b>Ilya</b>: the flow - site operator sets a policy that enables the profiler?</span></li><li class="c1 li-bullet-0"><span class="c3"><b>Andrew</b>: yeah</span></li><li class="c1 li-bullet-0"><span class="c3"><b>Ilya</b>: Why not through JS?</span></li><li class="c1 li-bullet-0"><span class="c3"><b>Andrew</b>: because the creation stops the VM and can leak info?</span></li><li class="c1 li-bullet-0"><span class="c3"><b>Todd</b>: Is that a Blink implementation issue?</span></li><li class="c1 li-bullet-0"><span class="c3"><b>Andrew</b>: Talked to Markus</span></li><li class="c1 li-bullet-0"><span class="c3"><b>Markus</b>: It might be possible to avoid it, but Firefox will have the same problem</span></li><li class="c1 li-bullet-0"><span class="c3"><b>Todd</b>: Chakra could have done that, but not sure that</span></li><li class="c1 li-bullet-0"><span class="c3"><b>Yoav</b>: header registration may be enough, so Feature Policy may be an overkill</span></li><li class="c1 li-bullet-0"><span class="c3"><b>Tim</b>: Slightly different as we want to enable measurement, not necessarily start it</span></li><li class="c1 li-bullet-0"><span class="c3"><b>Andrew</b>: Not married to FP</span></li></ul><ul class="c2 lst-kix_vd881xrd9hrg-1 start"><li class="c5 li-bullet-0"><span class="c3"><b>Trace format</b>: Form of structural compression. Do we need to add gzip or other compression. Deduping URLs was a big win. Gzip blobs may not be great for everyone, as some consumers may not need some of the trace.</span></li></ul><ul class="c2 lst-kix_vd881xrd9hrg-0"><li class="c1 li-bullet-0"><span class="c3"><b>Yoav</b>: gzip in the browser may be a good complement to that</span></li><li class="c1 li-bullet-0"><span class="c3"><b>Andrew</b>: have success with a wasm impl of snappy compression</span></li></ul><ul class="c2 lst-kix_vd881xrd9hrg-1 start"><li class="c5 li-bullet-0"><span class="c3">Trace sizes - 22KB gzipped</span></li></ul><ul class="c2 lst-kix_vd881xrd9hrg-0"><li class="c1 li-bullet-0"><span class="c3"><b>Ilya</b>: doesn’t seem too scary</span></li><li class="c1 li-bullet-0"><span class="c3"><b>Nic</b>: 22KB gzipped is on the upper end of what we can get away with</span></li><li class="c1 li-bullet-0"><span class="c3"><b>Tim</b>: what about the 10ms sample rate? You can get away with slower sampling</span></li><li class="c1 li-bullet-0"><span class="c3"><b>Andrew</b>: yeah, measured worst case scenario</span></li></ul><ul class="c2 lst-kix_vd881xrd9hrg-1 start"><li class="c5 li-bullet-0"><span class="c3">Testing - spec doesn’t provide guarantees to sampling rate</span></li></ul><ul class="c2 lst-kix_vd881xrd9hrg-0"><li class="c1 li-bullet-0"><span class="c3"><b>Yoav</b>: You can maybe enforce sampling using a webdriver API</span></li><li class="c1 li-bullet-0"><span class="c3"><b>Andrew</b>: sure. Web driver sounds good. Would be better if we could test directly</span></li></ul><ul class="c2 lst-kix_vd881xrd9hrg-1 start"><li class="c5 li-bullet-0"><span class="c3">Callback - DOM callback </span></li></ul><p class="c8"><span class="c3">&lt;out of time&gt;</span></p><p class="c7"><span class="c3"></span></p><p class="c7"><span class="c3"></span></p><p class="c7"><span class="c3"></span></p></div></div><div id="footer"><span>Published by <a target="_blank" title="Learn more about Google Drive" href="https://docs.google.com/">Google Drive</a></span><span class="dash">–</span><a href="https://docs.google.com/u/0/abuse?id=AKkXjow4XLsatUBw9kfhZepbmd7Oz4dDI_h_6xDxuyQNNX-dtsyU4aK0X7MjRw9hWjzezdEa_RbzZhZBsYKXiH8:0">Report Abuse</a></div><script type="text/javascript" nonce="">(function(){/*

 Copyright The Closure Library Authors.
 SPDX-License-Identifier: Apache-2.0
*/
var aa="function"==typeof Object.defineProperties?Object.defineProperty:function(a,b,c){if(a==Array.prototype||a==Object.prototype)return a;a[b]=c.value;return a};function ba(a){a=["object"==typeof globalThis&&globalThis,a,"object"==typeof window&&window,"object"==typeof self&&self,"object"==typeof global&&global];for(var b=0;b<a.length;++b){var c=a[b];if(c&&c.Math==Math)return c}throw Error("Cannot find global object");}var ca=ba(this);
function da(a,b){if(b)a:{var c=ca;a=a.split(".");for(var d=0;d<a.length-1;d++){var e=a[d];if(!(e in c))break a;c=c[e]}a=a[a.length-1];d=c[a];b=b(d);b!=d&&null!=b&&aa(c,a,{configurable:!0,writable:!0,value:b})}}var ea="function"==typeof Object.create?Object.create:function(a){function b(){}b.prototype=a;return new b},fa;
if("function"==typeof Object.setPrototypeOf)fa=Object.setPrototypeOf;else{var ha;a:{var ia={a:!0},ja={};try{ja.__proto__=ia;ha=ja.a;break a}catch(a){}ha=!1}fa=ha?function(a,b){a.__proto__=b;if(a.__proto__!==b)throw new TypeError(a+" is not extensible");return a}:null}var ka=fa;
function h(a,b){a.prototype=ea(b.prototype);a.prototype.constructor=a;if(ka)ka(a,b);else for(var c in b)if("prototype"!=c)if(Object.defineProperties){var d=Object.getOwnPropertyDescriptor(b,c);d&&Object.defineProperty(a,c,d)}else a[c]=b[c];a.o=b.prototype}da("Object.is",function(a){return a?a:function(b,c){return b===c?0!==b||1/b===1/c:b!==b&&c!==c}});var l=this||self;function la(){}function ma(a){var b=typeof a;return"object"==b&&null!=a||"function"==b}
function na(a,b){var c=Array.prototype.slice.call(arguments,1);return function(){var d=c.slice();d.push.apply(d,arguments);return a.apply(this,d)}}function oa(a,b){function c(){}c.prototype=b.prototype;a.o=b.prototype;a.prototype=new c;a.prototype.constructor=a;a.B=function(d,e,f){for(var g=Array(arguments.length-2),k=2;k<arguments.length;k++)g[k-2]=arguments[k];return b.prototype[e].apply(d,g)}}function pa(a){return a};var qa=Array.prototype.indexOf?function(a,b){return Array.prototype.indexOf.call(a,b,void 0)}:function(a,b){if("string"===typeof a)return"string"!==typeof b||1!=b.length?-1:a.indexOf(b,0);for(var c=0;c<a.length;c++)if(c in a&&a[c]===b)return c;return-1};function ra(a,b,c){for(var d in a)b.call(c,a[d],d,a)};var m;function p(a,b){this.i=a===sa&&b||"";this.j=ta}p.prototype.h=!0;p.prototype.g=function(){return this.i};var ta={},sa={};var ua=String.prototype.trim?function(a){return a.trim()}:function(a){return/^[\s\xa0]*([\s\S]*?)[\s\xa0]*$/.exec(a)[1]},va=/&/g,wa=/</g,xa=/>/g,ya=/"/g,za=/'/g,Aa=/\x00/g,Ba=/[\x00&<>"']/;function Ca(a,b){return a<b?-1:a>b?1:0};function q(a,b){this.i=b===r?a:""}q.prototype.h=!0;q.prototype.g=function(){return this.i.toString()};q.prototype.toString=function(){return this.i.toString()};function u(a){return a instanceof q&&a.constructor===q?a.i:"type_error:SafeUrl"}
var Da=/^(?:audio\/(?:3gpp2|3gpp|aac|L16|midi|mp3|mp4|mpeg|oga|ogg|opus|x-m4a|x-matroska|x-wav|wav|webm)|font\/\w+|image\/(?:bmp|gif|jpeg|jpg|png|tiff|webp|x-icon)|video\/(?:mpeg|mp4|ogg|webm|quicktime|x-matroska))(?:;\w+=(?:\w+|"[\w;,= ]+"))*$/i,Ea=/^data:(.*);base64,[a-z0-9+\/]+=*$/i,Fa=/^(?:(?:https?|mailto|ftp):|[^:/?#]*(?:[/?#]|$))/i;function Ga(a){if(a instanceof q)return a;a="object"==typeof a&&a.h?a.g():String(a);Fa.test(a)||(a="about:invalid#zClosurez");return new q(a,r)}
var r={},Ha=new q("about:invalid#zClosurez",r);var v;a:{var Ia=l.navigator;if(Ia){var Ja=Ia.userAgent;if(Ja){v=Ja;break a}}v=""}function w(a){return-1!=v.indexOf(a)};function x(a,b,c){this.i=c===Ka?a:""}x.prototype.h=!0;x.prototype.g=function(){return this.i.toString()};x.prototype.toString=function(){return this.i.toString()};var Ka={};function La(a,b,c,d){a=a instanceof q?a:Ga(a);b=b||l;c=c instanceof p?c instanceof p&&c.constructor===p&&c.j===ta?c.i:"type_error:Const":c||"";return void 0!==d?b.open(u(a),c,d,void 0):b.open(u(a),c)};function Ma(a){Ma[" "](a);return a}Ma[" "]=la;function y(a,b,c){return Object.prototype.hasOwnProperty.call(a,b)?a[b]:a[b]=c(b)};var Na=w("Opera"),z=w("Trident")||w("MSIE"),Oa=w("Edge"),Pa=Oa||z,Qa=w("Gecko")&&!(-1!=v.toLowerCase().indexOf("webkit")&&!w("Edge"))&&!(w("Trident")||w("MSIE"))&&!w("Edge"),Ra=-1!=v.toLowerCase().indexOf("webkit")&&!w("Edge"),Sa=w("Macintosh");function Ta(){var a=l.document;return a?a.documentMode:void 0}var Ua;
a:{var Va="",Wa=function(){var a=v;if(Qa)return/rv:([^\);]+)(\)|;)/.exec(a);if(Oa)return/Edge\/([\d\.]+)/.exec(a);if(z)return/\b(?:MSIE|rv)[: ]([^\);]+)(\)|;)/.exec(a);if(Ra)return/WebKit\/(\S+)/.exec(a);if(Na)return/(?:Version)[ \/]?(\S+)/.exec(a)}();Wa&&(Va=Wa?Wa[1]:"");if(z){var Xa=Ta();if(null!=Xa&&Xa>parseFloat(Va)){Ua=String(Xa);break a}}Ua=Va}var Ya=Ua,Za={},$a;if(l.document&&z){var ab=Ta();$a=ab?ab:parseInt(Ya,10)||void 0}else $a=void 0;var bb=$a;function cb(a){return y(a.prototype,"$$generatedClassName",function(){return"Class$obf_"+{valueOf:function(){return++db}}})}var db=1E3;function A(){}A.prototype.u=function(){return this.j||(Object.defineProperties(this,{j:{value:++eb,enumerable:!1}}),this.j)};A.prototype.toString=function(){var a=B(fb(gb(this.constructor)))+"@";var b=(this.u()>>>0).toString(16);return a+B(b)};function D(){}h(D,A);D.prototype.i=function(a){this.h=a;if(a instanceof Object)try{a.A=this}catch(b){}};function hb(a){a.h instanceof Error&&(Error.captureStackTrace?Error.captureStackTrace(a.h):a.h.stack=Error().stack)}D.prototype.toString=function(){var a=fb(gb(this.constructor)),b=this.l;return null==b?a:B(a)+": "+B(b)};function ib(){}h(ib,D);function jb(){}h(jb,ib);var eb=0;function E(){}h(E,jb);E.prototype.i=function(a){jb.prototype.i.call(this,Object.is(this.g,"__noinit__")?a:this.g)};function kb(){}h(kb,E);function lb(a,b){return"string"==typeof a?a.charCodeAt(b):a.g(b)};function B(a){return null==a?"null":a.toString()}function mb(a){return 65536<=a?B(String.fromCharCode((55296+((a-65536|0)>>10&1023)|0)&65535))+B(String.fromCharCode((56320+((a-65536|0)&1023)|0)&65535)):String.fromCharCode(a&65535)}function nb(a,b){var c=b,d=a.length,e;b=lb(a,(e=c,c=c+1|0,e));var f;if(e=55296<=b&&56319>=b&&c<d)a=f=lb(a,c),e=56320<=a&&57343>=a;var g;e?g=65536+((b&1023)<<10)+(f&1023)|0:g=b;return g};function ob(a,b){this.h=a;this.g=b}h(ob,A);function fb(a){var b=cb(a.h);0!=a.g&&(b="L"+B(b)+";");a=a.g;for(var c="",d=0;d<a;d=d+1|0)c=B(c)+"[";return B(c)+B(b)}ob.prototype.toString=function(){return"class "+B(fb(this))};function gb(a){var b=0;return y(a.prototype,"$$class/"+b,function(){return new ob(a,b)})};function pb(a,b){return null==a?a:b?decodeURI(a):decodeURIComponent(a)};var qb=/^(?:([^:/?#.]+):)?(?:\/\/(?:([^/?#]*)@)?([^/#?]*?)(?::([0-9]+))?(?=[/#?]|$))?([^?#]+)?(?:\?([^#]*))?(?:#([\S\s]*))?$/;function rb(a){a=qb.exec(a);for(var b=[],c=0;7>=c;c=c+1|0)a.length<=c||null==a[c]?b.push(null):b.push(a[c]);return b}
function sb(a,b){var c=a.indexOf(mb(35));c=0>c?a.length:c;a:{var d=0;for(var e=b.length;0<(d=a.indexOf(b,d))&&d<c;){var f=nb(a,d-1|0);if(38==f||63==f){if((d+e|0)>=a.length)break a;f=nb(a,d+e|0);if(61==f||38==f||35==f)break a}d=d+(e+1)|0}d=-1}if(0>d)return null;e=a.indexOf(mb(38),d);if(0>e||e>c)e=c;d=d+(b.length+1)|0;b=Math.min(a.length,d);a=a.substr(b,Math.min(a.length,Math.max(d,e))-b|0);c=" ";for(b=0;0<=(b=c.indexOf("\\",b));)36==c.charCodeAt(b+1|0)?(d=B(c.substr(0,b|0))+"$",e=b=b+1|0,c=d+B(c.substr(e))):
(d=B(c.substr(0,b|0)),e=b=b+1|0,c=d+B(c.substr(e)));a=a.replace(/\+/g,c);return pb(a,!1)};function F(a,b){this.h=b;for(var c=[],d=!0,e=a.length-1;0<=e;e--){var f=a[e]|0;d&&f==b||(c[e]=f,d=!1)}this.g=c}var tb={};function ub(a){return-128<=a&&128>a?y(tb,a,function(b){return new F([b|0],0>b?-1:0)}):new F([a|0],0>a?-1:0)}function G(a){if(isNaN(a)||!isFinite(a))return H;if(0>a)return I(G(-a));for(var b=[],c=1,d=0;a>=c;d++)b[d]=a/c|0,c*=4294967296;return new F(b,0)}var H=ub(0),J=ub(1),vb=ub(16777216);
function K(a){if(-1==a.h)return-K(I(a));for(var b=0,c=1,d=0;d<a.g.length;d++){var e=L(a,d);b+=(0<=e?e:4294967296+e)*c;c*=4294967296}return b}F.prototype.toString=function(a){a=a||10;if(2>a||36<a)throw Error("radix out of range: "+a);if(M(this))return"0";if(-1==this.h)return"-"+I(this).toString(a);for(var b=G(Math.pow(a,6)),c=this,d="";;){var e=wb(c,b).g;c=N(c,O(e,b));var f=((0<c.g.length?c.g[0]:c.h)>>>0).toString(a);c=e;if(M(c))return f+d;for(;6>f.length;)f="0"+f;d=f+d}};
function L(a,b){return 0>b?0:b<a.g.length?a.g[b]:a.h}function M(a){if(0!=a.h)return!1;for(var b=0;b<a.g.length;b++)if(0!=a.g[b])return!1;return!0}function P(a,b){a=N(a,b);return-1==a.h?-1:M(a)?0:1}function I(a){for(var b=a.g.length,c=[],d=0;d<b;d++)c[d]=~a.g[d];return(new F(c,~a.h)).add(J)}F.prototype.abs=function(){return-1==this.h?I(this):this};
F.prototype.add=function(a){for(var b=Math.max(this.g.length,a.g.length),c=[],d=0,e=0;e<=b;e++){var f=d+(L(this,e)&65535)+(L(a,e)&65535),g=(f>>>16)+(L(this,e)>>>16)+(L(a,e)>>>16);d=g>>>16;f&=65535;g&=65535;c[e]=g<<16|f}return new F(c,c[c.length-1]&-2147483648?-1:0)};function N(a,b){return a.add(I(b))}
function O(a,b){if(M(a)||M(b))return H;if(-1==a.h)return-1==b.h?O(I(a),I(b)):I(O(I(a),b));if(-1==b.h)return I(O(a,I(b)));if(0>P(a,vb)&&0>P(b,vb))return G(K(a)*K(b));for(var c=a.g.length+b.g.length,d=[],e=0;e<2*c;e++)d[e]=0;for(e=0;e<a.g.length;e++)for(var f=0;f<b.g.length;f++){var g=L(a,e)>>>16,k=L(a,e)&65535,t=L(b,f)>>>16,n=L(b,f)&65535;d[2*e+2*f]+=k*n;Q(d,2*e+2*f);d[2*e+2*f+1]+=g*n;Q(d,2*e+2*f+1);d[2*e+2*f+1]+=k*t;Q(d,2*e+2*f+1);d[2*e+2*f+2]+=g*t;Q(d,2*e+2*f+2)}for(e=0;e<c;e++)d[e]=d[2*e+1]<<16|
d[2*e];for(e=c;e<2*c;e++)d[e]=0;return new F(d,0)}function Q(a,b){for(;(a[b]&65535)!=a[b];)a[b+1]+=a[b]>>>16,a[b]&=65535,b++}function S(a,b){this.g=a;this.h=b}
function wb(a,b){if(M(b))throw Error("division by zero");if(M(a))return new S(H,H);if(-1==a.h)return b=wb(I(a),b),new S(I(b.g),I(b.h));if(-1==b.h)return b=wb(a,I(b)),new S(I(b.g),b.h);if(30<a.g.length){if(-1==a.h||-1==b.h)throw Error("slowDivide_ only works with positive integers.");for(var c=J,d=b;0>=P(d,a);)c=xb(c,1),d=xb(d,1);var e=T(c,1),f=T(d,1);d=T(d,2);for(c=T(c,2);!M(d);){var g=f.add(d);0>=P(g,a)&&(e=e.add(c),f=g);d=T(d,1);c=T(c,1)}b=N(a,O(e,b));return new S(e,b)}for(e=H;0<=P(a,b);){c=Math.max(1,
Math.floor(K(a)/K(b)));d=Math.ceil(Math.log(c)/Math.LN2);d=48>=d?1:Math.pow(2,d-48);f=G(c);for(g=O(f,b);-1==g.h||0<P(g,a);)c-=d,f=G(c),g=O(f,b);M(f)&&(f=J);e=e.add(f);a=N(a,g)}return new S(e,a)}F.prototype.and=function(a){for(var b=Math.max(this.g.length,a.g.length),c=[],d=0;d<b;d++)c[d]=L(this,d)&L(a,d);return new F(c,this.h&a.h)};F.prototype.or=function(a){for(var b=Math.max(this.g.length,a.g.length),c=[],d=0;d<b;d++)c[d]=L(this,d)|L(a,d);return new F(c,this.h|a.h)};
F.prototype.xor=function(a){for(var b=Math.max(this.g.length,a.g.length),c=[],d=0;d<b;d++)c[d]=L(this,d)^L(a,d);return new F(c,this.h^a.h)};function xb(a,b){var c=b>>5;b%=32;for(var d=a.g.length+c+(0<b?1:0),e=[],f=0;f<d;f++)e[f]=0<b?L(a,f-c)<<b|L(a,f-c-1)>>>32-b:L(a,f-c);return new F(e,a.h)}function T(a,b){var c=b>>5;b%=32;for(var d=a.g.length-c,e=[],f=0;f<d;f++)e[f]=0<b?L(a,f+c)>>>b|L(a,f+c+1)<<32-b:L(a,f+c);return new F(e,a.h)};N(xb(J,32),J);N(xb(J,128),J);function yb(a){a&&"function"==typeof a.v&&a.v()};function U(){this.h=this.h;this.g=this.g}U.prototype.h=!1;U.prototype.v=function(){this.h||(this.h=!0,this.j())};U.prototype.j=function(){if(this.g)for(;this.g.length;)this.g.shift()()};var zb=!z||9<=Number(bb),Ab=!z||9<=Number(bb),Bb=z&&!y(Za,"9",function(){for(var a=0,b=ua(String(Ya)).split("."),c=ua("9").split("."),d=Math.max(b.length,c.length),e=0;0==a&&e<d;e++){var f=b[e]||"",g=c[e]||"";do{f=/(\d*)(\D*)(.*)/.exec(f)||["","","",""];g=/(\d*)(\D*)(.*)/.exec(g)||["","","",""];if(0==f[0].length&&0==g[0].length)break;a=Ca(0==f[1].length?0:parseInt(f[1],10),0==g[1].length?0:parseInt(g[1],10))||Ca(0==f[2].length,0==g[2].length)||Ca(f[2],g[2]);f=f[3];g=g[3]}while(0==a)}return 0<=a}),
Cb=function(){if(!l.addEventListener||!Object.defineProperty)return!1;var a=!1,b=Object.defineProperty({},"passive",{get:function(){a=!0}});try{l.addEventListener("test",la,b),l.removeEventListener("test",la,b)}catch(c){}return a}();function Db(a,b){this.type=a;this.g=this.target=b;this.defaultPrevented=!1}Db.prototype.h=function(){this.defaultPrevented=!0};function V(a,b){Db.call(this,a?a.type:"");this.relatedTarget=this.g=this.target=null;this.button=this.screenY=this.screenX=this.clientY=this.clientX=0;this.key="";this.metaKey=this.shiftKey=this.altKey=this.ctrlKey=!1;this.state=null;this.pointerId=0;this.pointerType="";this.i=null;if(a){var c=this.type=a.type,d=a.changedTouches&&a.changedTouches.length?a.changedTouches[0]:null;this.target=a.target||a.srcElement;this.g=b;if(b=a.relatedTarget){if(Qa){a:{try{Ma(b.nodeName);var e=!0;break a}catch(f){}e=
!1}e||(b=null)}}else"mouseover"==c?b=a.fromElement:"mouseout"==c&&(b=a.toElement);this.relatedTarget=b;d?(this.clientX=void 0!==d.clientX?d.clientX:d.pageX,this.clientY=void 0!==d.clientY?d.clientY:d.pageY,this.screenX=d.screenX||0,this.screenY=d.screenY||0):(this.clientX=void 0!==a.clientX?a.clientX:a.pageX,this.clientY=void 0!==a.clientY?a.clientY:a.pageY,this.screenX=a.screenX||0,this.screenY=a.screenY||0);this.button=a.button;this.key=a.key||"";this.ctrlKey=a.ctrlKey;this.altKey=a.altKey;this.shiftKey=
a.shiftKey;this.metaKey=a.metaKey;this.pointerId=a.pointerId||0;this.pointerType="string"===typeof a.pointerType?a.pointerType:Eb[a.pointerType]||"";this.state=a.state;this.i=a;a.defaultPrevented&&V.o.h.call(this)}}oa(V,Db);var Fb=[1,4,2],Eb={2:"touch",3:"pen",4:"mouse"};V.prototype.h=function(){V.o.h.call(this);var a=this.i;if(a.preventDefault)a.preventDefault();else if(a.returnValue=!1,Bb)try{if(a.ctrlKey||112<=a.keyCode&&123>=a.keyCode)a.keyCode=-1}catch(b){}};var Gb="closure_listenable_"+(1E6*Math.random()|0);var Hb=0;function Ib(a,b,c,d,e){this.listener=a;this.g=null;this.src=b;this.type=c;this.capture=!!d;this.h=e;this.key=++Hb;this.m=this.s=!1}function Jb(a){a.m=!0;a.listener=null;a.g=null;a.src=null;a.h=null};function Kb(a){this.src=a;this.g={};this.h=0}Kb.prototype.add=function(a,b,c,d,e){var f=a.toString();a=this.g[f];a||(a=this.g[f]=[],this.h++);var g;a:{for(g=0;g<a.length;++g){var k=a[g];if(!k.m&&k.listener==b&&k.capture==!!d&&k.h==e)break a}g=-1}-1<g?(b=a[g],c||(b.s=!1)):(b=new Ib(b,this.src,f,!!d,e),b.s=c,a.push(b));return b};function Lb(a,b){var c=b.type;if(c in a.g){var d=a.g[c],e=qa(d,b),f;(f=0<=e)&&Array.prototype.splice.call(d,e,1);f&&(Jb(b),0==a.g[c].length&&(delete a.g[c],a.h--))}};var Mb="closure_lm_"+(1E6*Math.random()|0),Nb={},Ob=0;function Pb(a,b,c,d,e){if(d&&d.once)return Qb(a,b,c,d,e);if(Array.isArray(b)){for(var f=0;f<b.length;f++)Pb(a,b[f],c,d,e);return null}c=Rb(c);return a&&a[Gb]?a.g.add(String(b),c,!1,ma(d)?!!d.capture:!!d,e):Sb(a,b,c,!1,d,e)}
function Sb(a,b,c,d,e,f){if(!b)throw Error("Invalid event type");var g=ma(e)?!!e.capture:!!e,k=Tb(a);k||(a[Mb]=k=new Kb(a));c=k.add(b,c,d,g,f);if(c.g)return c;d=Ub();c.g=d;d.src=a;d.listener=c;if(a.addEventListener)Cb||(e=g),void 0===e&&(e=!1),a.addEventListener(b.toString(),d,e);else if(a.attachEvent)a.attachEvent(Vb(b.toString()),d);else if(a.addListener&&a.removeListener)a.addListener(d);else throw Error("addEventListener and attachEvent are unavailable.");Ob++;return c}
function Ub(){var a=Wb,b=Ab?function(c){return a.call(b.src,b.listener,c)}:function(c){c=a.call(b.src,b.listener,c);if(!c)return c};return b}function Qb(a,b,c,d,e){if(Array.isArray(b)){for(var f=0;f<b.length;f++)Qb(a,b[f],c,d,e);return null}c=Rb(c);return a&&a[Gb]?a.g.add(String(b),c,!0,ma(d)?!!d.capture:!!d,e):Sb(a,b,c,!0,d,e)}
function Xb(a){if("number"!==typeof a&&a&&!a.m){var b=a.src;if(b&&b[Gb])Lb(b.g,a);else{var c=a.type,d=a.g;b.removeEventListener?b.removeEventListener(c,d,a.capture):b.detachEvent?b.detachEvent(Vb(c),d):b.addListener&&b.removeListener&&b.removeListener(d);Ob--;(c=Tb(b))?(Lb(c,a),0==c.h&&(c.src=null,b[Mb]=null)):Jb(a)}}}function Vb(a){return a in Nb?Nb[a]:Nb[a]="on"+a}
function Yb(a,b,c,d){var e=!0;if(a=Tb(a))if(b=a.g[b.toString()])for(b=b.concat(),a=0;a<b.length;a++){var f=b[a];f&&f.capture==c&&!f.m&&(f=Zb(f,d),e=e&&!1!==f)}return e}function Zb(a,b){var c=a.listener,d=a.h||a.src;a.s&&Xb(a);return c.call(d,b)}
function Wb(a,b){if(a.m)return!0;if(!Ab){if(!b)a:{b=["window","event"];for(var c=l,d=0;d<b.length;d++)if(c=c[b[d]],null==c){b=null;break a}b=c}d=b;b=new V(d,this);c=!0;if(!(0>d.keyCode||void 0!=d.returnValue)){a:{var e=!1;if(0==d.keyCode)try{d.keyCode=-1;break a}catch(g){e=!0}if(e||void 0==d.returnValue)d.returnValue=!0}d=[];for(e=b.g;e;e=e.parentNode)d.push(e);a=a.type;for(e=d.length-1;0<=e;e--){b.g=d[e];var f=Yb(d[e],a,!0,b);c=c&&f}for(e=0;e<d.length;e++)b.g=d[e],f=Yb(d[e],a,!1,b),c=c&&f}return c}return Zb(a,
new V(b,this))}function Tb(a){a=a[Mb];return a instanceof Kb?a:null}var $b="__closure_events_fn_"+(1E9*Math.random()>>>0);function Rb(a){if("function"===typeof a)return a;a[$b]||(a[$b]=function(b){return a.handleEvent(b)});return a[$b]};function W(a){U.call(this);this.l=a;this.i={}}oa(W,U);var ac=[];function bc(a){ra(a.i,function(b,c){this.i.hasOwnProperty(c)&&Xb(b)},a);a.i={}}W.prototype.j=function(){W.o.j.call(this);bc(this)};W.prototype.handleEvent=function(){throw Error("EventHandler.handleEvent not implemented");};function cc(a){U.call(this);this.i=a||document.body;this.l=new W(this);a=na(yb,this.l);this.h?a():(this.g||(this.g=[]),this.g.push(a));a=this.l;var b=this.i,c=this.u,d="click";Array.isArray(d)||(d&&(ac[0]=d.toString()),d=ac);for(var e=0;e<d.length;e++){var f=Pb(b,d[e],c||a.handleEvent,!1,a.l||a);if(!f)break;a.i[f.key]=f}}h(cc,U);
cc.prototype.u=function(a){if(!(!(zb?0==a.i.button:"click"==a.type||a.i.button&Fb[0])||Sa&&a.ctrlKey||a.defaultPrevented))for(var b=a.target;b&&b!=this.i;){if(b.tagName&&"a"==b.tagName.toLowerCase()){var c=b.getAttribute("href")||b.getAttributeNS("http://www.w3.org/1999/xlink","href"),d=c;try{var e=rb(c)[3];var f;if(f="www.google.com"===pb(e,!0)){var g=rb(c)[5];f="/url"===pb(g,!0)}if(f){var k=sb(c,"q");d=k?k:sb(c,"url")}}catch(C){a:{var t=C;if(null!=t){var n=t.A;if(null!=n){C=n;break a}}if(t instanceof
TypeError){var R=n=new kb;R.l=B(t);hb(R);n.g="__noinit__";n.g=t;n.i(new TypeError(n));t=n}else R=n=new E,R.l=B(t),hb(R),n.g="__noinit__",n.g=t,n.i(Error(n)),t=n;C=t}if(!(C instanceof ib))throw C.h;}d=null!=d?d:"";if(c!=d){e=void 0;b={target:"_blank",noreferrer:!0};c=window;d instanceof q?f=d:(f="undefined"!=typeof d.href?d.href:String(d),f instanceof q||(f="object"==typeof f&&f.h?f.g():String(f),Fa.test(f)?f=new q(f,r):(f=String(f),f=f.replace(/(%0A|%0D)/g,""),f=(g=f.match(Ea))&&Da.test(g[1])?new q(f,
r):null)),f=f||Ha);d=b.target||d.target;g=[];for(e in b)switch(e){case "width":case "height":case "top":case "left":g.push(e+"="+b[e]);break;case "target":case "noopener":case "noreferrer":break;default:g.push(e+"="+(b[e]?1:0))}e=g.join(",");if((w("iPhone")&&!w("iPod")&&!w("iPad")||w("iPad")||w("iPod"))&&c.navigator&&c.navigator.standalone&&d&&"_self"!=d)e="A",g=document,e=String(e),"application/xhtml+xml"===g.contentType&&(e=e.toLowerCase()),g=e=g.createElement(e),f=f instanceof q?f:Ga(f),g.href=
u(f),e.setAttribute("target",d),b.noreferrer&&e.setAttribute("rel","noreferrer"),b=document.createEvent("MouseEvent"),b.initMouseEvent("click",!0,!0,c,1),e.dispatchEvent(b);else if(b.noreferrer){if(c=La("",c,d,e),b=u(f),c){Pa&&-1!=b.indexOf(";")&&(b="'"+b.replace(/'/g,"%27")+"'");c.opener=null;Ba.test(b)&&(-1!=b.indexOf("&")&&(b=b.replace(va,"&amp;")),-1!=b.indexOf("<")&&(b=b.replace(wa,"&lt;")),-1!=b.indexOf(">")&&(b=b.replace(xa,"&gt;")),-1!=b.indexOf('"')&&(b=b.replace(ya,"&quot;")),-1!=b.indexOf("'")&&
(b=b.replace(za,"&#39;")),-1!=b.indexOf("\x00")&&(b=b.replace(Aa,"&#0;")));b='<meta name="referrer" content="no-referrer"><meta http-equiv="refresh" content="0; url='+b+'">';if(void 0===m)if(d=null,(e=l.trustedTypes)&&e.createPolicy){try{d=e.createPolicy("goog#html",{createHTML:pa,createScript:pa,createScriptURL:pa})}catch(C){l.console&&l.console.error(C.message)}m=d}else m=d;b=(d=m)?d.createHTML(b):b;b=new x(b,null,Ka);(c=c.document)&&c.write&&(c.write(b instanceof x&&b.constructor===x?b.i:"type_error:SafeHtml"),
c.close())}}else(c=La(f,c,d,e))&&b.noopener&&(c.opener=null);a.h();break}}b=b.parentNode}};function dc(a){new cc(a)}var X=["DOCS_installLinkReferrerSanitizer"],Y=l;X[0]in Y||"undefined"==typeof Y.execScript||Y.execScript("var "+X[0]);for(var Z;X.length&&(Z=X.shift());)X.length||void 0===dc?Y[Z]&&Y[Z]!==Object.prototype[Z]?Y=Y[Z]:Y=Y[Z]={}:Y[Z]=dc;}).call(this);
</script><script type="text/javascript" nonce="">DOCS_installLinkReferrerSanitizer();</script></body></html>